package com.jt.demos;

import redis.clients.jedis.Jedis;

/**
 * 秒杀队列演示
 *      描述逻辑中会将商品抢购信息先写到redis（以队列形式进行存储）
 *      因为写redis内存数据库相对于写mysql数据库要快很多
 *      算法：先进先出(FIFO)，提现了公平性
 * @ClassName SecondKillDemo1
 * @Description 秒杀队里
 * @Author Jiyao
 * @DATE 2021-12-05 17:12
 * @Version 1.0
 **/
public class SecondKillDemo1 {

    //商品抢购首先是入队
    static void enque(String msg){//入队
        Jedis jedis = new Jedis("192.168.236.128", 6379);
        //jedis.auth("123456");
        //redis中的lpush：将一个或者多个元素插入到列表头部，
        // 如果key不存在，一个空列表会被创建并且执行lpush操作；
        //当key存在但不是列表类型时，返回一个错误。
        jedis.lpush("queue",msg);
        jedis.close();
    }

    //底层异步出队（基于该信息，生成订单，扣减库存）
    static String deque(){//出队
        Jedis jedis = new Jedis("192.168.236.128", 6379);
        //jedis.auth("123456");
        //redis中的rpop：移除列表中的最后一个元素，返回值为移除的元素
        String result = jedis.rpop("queue");
        jedis.close();
        return result;
    }

    public static void main(String[] args) {
        //1、多次抢购（模拟在界面上多次点击操作）
       new Thread(){
           @Override
           public void run() {
               //模拟10次页面点击
               for (int i = 0; i < 10; i++) {
                   //String.valueOf(i) 将基本类型的i装换成字符串类型
                   enque(String.valueOf(i));
                   try {
                       Thread.sleep(1000);
                   }catch (Exception e){

                   }
               }
           }
       }.start();
        //2、从队列去内容（模拟后台从队里取数据）
        new Thread(){
            @Override
            public void run() {
                for (;;){
                    String msg = deque();
                    if (msg==null){
                        continue;
                    }
                    System.out.println(msg);
                }
            }
        }.start();
    }
}
